#include "arbre.h"

void initialiserArbre(Arbre *pA)
{
  pA->adRacine = NULL;
  pA->nbElemDansArbre = 0;
}

void testamentNoeud(Noeud **pN)
{
  if((*pN))
    {
      testamentNoeud(&((*pN)->fg));
      testamentNoeud(&((*pN)->fd));
      free((*pN));
      (*pN) = NULL;
    }
}

void testamentArbre(Arbre *pA)
{
  if(pA->adRacine)
    {
      testamentNoeud(&(pA->adRacine));
    }
}

int testArbreVide(Arbre A)
{
  if(A.adRacine)
    {
      if(A.adRacine->fg)
	return 0;
      if(A.adRacine->fd)
	return 0;
    }
  return 1;
}

void affichageNoeudInfixe(const Noeud *pN)
{
  if(pN)
    {
      affichageNoeudInfixe(pN->fg);
      afficherElem(pN->info);
      affichageNoeudInfixe(pN->fd);
    }
}

void affichageInfixeArbre(Arbre A)
{
  if(testArbreVide(A))
    return;
  affichageNoeudInfixe(A.adRacine->fg);
  afficherElem(A.adRacine->info);
  affichageNoeudInfixe(A.adRacine->fd);
}

void affichageNoeudPrefixe(const Noeud *pN)
{
  if(pN)
    {
      afficherElem(pN->info);
      affichageNoeudPrefixe(pN->fg);
      affichageNoeudPrefixe(pN->fd);
    }
}

void affichagePrefixeArbre(Arbre A)
{
  if(testArbreVide(A))
    return;
  afficherElem(A.adRacine->info);
  affichageNoeudPrefixe(A.adRacine->fg);
  affichageNoeudPrefixe(A.adRacine->fd);
}

void affichageNoeudPostfixe(const Noeud *pN)
{
  if(pN)
    {
      affichageNoeudPostfixe(pN->fg);
      affichageNoeudPostfixe(pN->fd);
      afficherElem(pN->info);
    }
}

void affichagePostfixeArbre(Arbre A)
{
  if(testArbreVide(A))
    return;
  affichageNoeudPostfixe(A.adRacine->fg);
  affichageNoeudPostfixe(A.adRacine->fd);
  afficherElem(A.adRacine->info);
}

void copierNoeud(Noeud **pA, const Noeud *B)
{
  if(B)
    {
      (*pA) = (Noeud *) malloc (1 * sizeof(Noeud));
      (*pA)->info = B->info;
      copierNoeud(&((*pA)->fg), B->fg);
      copierNoeud(&((*pA)->fd), B->fd);
    }
  else
    {
      (*pA) = NULL;
    }
}

void copier(Arbre *pA, Arbre B)
{
  testamentNoeud(&(pA->adRacine));
  initialiserArbre(pA);
  if(testArbreVide(B))
    return;
  copierNoeud(&(pA->adRacine), B.adRacine);
  pA->nbElemDansArbre = B.nbElemDansArbre;
}
